#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include "tinyxml2.h"

using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::regex;
using std::regex_replace;

using namespace tinyxml2;

// 使用tinyXml2库解析RSS文件，并生成一个网页库pagelib.txt
// tinyXml2 -- https://github.com/leethomason/tinyxml2
// rss -- http://www.runoob.com/rss/rss-tutorial.html
// 对于html的标签需要使用正则表达式进行过滤，正则表达式需要用到标准库中的std::regex
// 参考接口：


struct RssItem {
    string title;
    string link;
    string description;
    string content;
};
   
class RssReader{
public:
    RssReader();
    void parseRss();//解析
    void dump(const string & filename);//输出
private:
    vector<RssItem> _rss;
};



RssReader::RssReader(){
    _rss.reserve(20);
}

void RssReader::parseRss(){
    XMLDocument doc;
    doc.LoadFile("coolshell.xml");
    XMLElement* root = doc.RootElement();

    XMLElement* itemElement = nullptr;
    while(1){
        itemElement = root->FirstChildElement("item");
        if(itemElement == nullptr){
            root = root->FirstChildElement();
        }else{
            break;
        }
    }
    regex reg("<.*?>");

    while(itemElement){
        
        XMLElement* titleElement = itemElement->FirstChildElement("title");
        string title = titleElement->GetText();
        XMLElement* linkElement = itemElement->FirstChildElement("link");
        string link = linkElement->GetText();
        XMLElement* descriptionElement = itemElement->FirstChildElement("description");
        string description = regex_replace(descriptionElement->GetText(), reg, "");

        XMLElement* contentElement = itemElement->FirstChildElement("content:encoded");
        string content = regex_replace(contentElement->GetText(), reg, "");

        _rss.push_back({title, link, description, content});

        itemElement = itemElement->NextSiblingElement();
    }

}

void RssReader::dump(const string & filename){

    XMLDocument doc;
    
    string num("1");
    for(auto& elem : _rss){
        // 创建根元素节点
        XMLElement *root = doc.NewElement("doc"); // XMLElement 元素节点
        doc.InsertEndChild(root);                 // InsertEndChild：这个函数将一个节点插入为父元素节点的最后一个子节点
        
        // 创建元素节点 "person" 并添加到根元素
        XMLElement *personElement = doc.NewElement("docid");
        root->InsertEndChild(personElement);

        // 创建文本节点并添加文本内容到 "person" 元素
        XMLText *textElement = doc.NewText(num.c_str()); // XMLText 文本节点
        personElement->InsertEndChild(textElement);
        // personElement->SetText("This is some text.aaaa");  // 也可以这样添加文本节点

        XMLElement *personElement2 = doc.NewElement("title");
        root->InsertEndChild(personElement2);

        XMLText *textElement2 = doc.NewText(elem.title.c_str()); // XMLText 文本节点
        personElement2->InsertEndChild(textElement2);

        XMLElement *personElement3 = doc.NewElement("link");
        root->InsertEndChild(personElement3);

        XMLText *textElement3 = doc.NewText(elem.link.c_str()); // XMLText 文本节点
        personElement3->InsertEndChild(textElement3);

        XMLElement *personElement4 = doc.NewElement("description");
        root->InsertEndChild(personElement4);

        XMLText *textElement4 = doc.NewText(elem.description.c_str()); // XMLText 文本节点
        personElement4->InsertEndChild(textElement4);

        XMLElement *personElement5 = doc.NewElement("content");
        root->InsertEndChild(personElement5);

        XMLText *textElement5 = doc.NewText(elem.content.c_str()); // XMLText 文本节点
        personElement5->InsertEndChild(textElement5);
        ++(num[0]);
        
    }
    doc.SaveFile(filename.c_str());
}






int main(void)
{
    RssReader reader;
    reader.parseRss();
    reader.dump("pagelib.xml");
    return 0;
}


// bool TiXmlBase::Parse(const char* p, TiXmlEncoding encoding)
// {
//     // 解析文本的代码
//     // ...
//     while (*p) {
//         if (*p == '&') {
//             if (strncmp(p, "&amp;", 5) == 0) {
//                 // 处理 '&' 实体
//                 result.push_back('&');
//                 p += 5;
//             } else if (strncmp(p, "&lt;", 4) == 0) {
//                 // 处理 '<' 实体
//                 result.push_back('<');
//                 p += 4;
//             } else if (strncmp(p, "&gt;", 4) == 0) {
//                 // 处理 '>' 实体
//                 result.push_back('>');
//                 p += 4;
//             } else if (strncmp(p, "&quot;", 6) == 0) {
//                 // 处理 '"' 实体
//                 result.push_back('"');
//                 p += 6;
//             } else if (strncmp(p, "&apos;", 6) == 0) {
//                 // 处理 '\'' 实体
//                 result.push_back('\'');
//                 p += 6;
//             } else {
//                 // 处理无效的字符实体
//                 throw std::runtime_error("Unrecognized character entity");
//             }
//         } else {
//             // 正常字符
//             result.push_back(*p);
//             p++;
//         }
//     }
// }